//
//  NSString+RBExtension.m
//  Budejie
//
//  Created by 华杨科技 on 2017/10/14.
//  Copyright © 2017年 饶波. All rights reserved.
//

#import "NSString+RBExtension.h"

@implementation NSString (RBExtension)

- (unsigned long long)rb_fileSize
{
    // 文件夹总大小
    NSUInteger size = 0;
    
    // 文件管理者
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    // 是否是文件夹
    BOOL isDirectroy = NO;
    // 文件路径是否存在
    BOOL isExist = [mgr fileExistsAtPath:self isDirectory:&isDirectroy];
    
    if (!isExist) return size; // 如果文件路径不存在,直接返回 0
    
    if (isDirectroy) { // 是文件夹
        // 枚举器
        NSDirectoryEnumerator *enumerator = [mgr enumeratorAtPath:self];
        for (NSString *subpath in enumerator) {
            // 全路径
            NSString *fullPath = [self stringByAppendingPathComponent:subpath];
            
            NSError *err;
            // 文件属性字典
            NSDictionary *attrsDic = [mgr attributesOfItemAtPath:fullPath error:&err];
            
            // 累加文件和
            size += attrsDic.fileSize;
        }
    }else { // 文件
        size = [mgr attributesOfItemAtPath:self error:nil].fileSize;
    }
    
    return size;
}

- (unsigned long long)fileSize
{
    // 文件夹总大小
    NSUInteger size = 0;
    
    // 文件管理者
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    // 是否是文件夹
    BOOL isDirectroy = NO;
    // 文件路径是否存在
    BOOL isExist = [mgr fileExistsAtPath:self isDirectory:&isDirectroy];
    
    if (!isExist) return size; // 如果文件路径不存在,直接返回 0
    
    if (isDirectroy) { // 是文件夹
        // 枚举器
        NSDirectoryEnumerator *enumerator = [mgr enumeratorAtPath:self];
        for (NSString *subpath in enumerator) {
            // 全路径
            NSString *fullPath = [self stringByAppendingPathComponent:subpath];
            
            NSError *err;
            // 文件属性字典
            NSDictionary *attrsDic = [mgr attributesOfItemAtPath:fullPath error:&err];
            
            // 累加文件和
            size += attrsDic.fileSize;
        }
    }else { // 文件
        size = [mgr attributesOfItemAtPath:self error:nil].fileSize;
    }
    
    return size;
}


- (unsigned long long)rb_fileSize2{
    
    // 总大小
    NSUInteger size = 0;
    
    // 文件管理者
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    /**判断self是文件夹还是文件**/
    NSDictionary *attrsSelf =  [mgr attributesOfItemAtPath:self error:nil];
    NSLog(@"%@",attrsSelf);
    if ([attrsSelf.fileType isEqualToString:NSFileTypeDirectory]) { // 文件夹
        // 枚举器
        NSDirectoryEnumerator *enumerator = [mgr enumeratorAtPath:self];
        for (NSString *subpath in enumerator) {
            // 文件全路径
            NSString *fullPath = [self stringByAppendingPathComponent:subpath];
            NSDictionary *attrs = [mgr attributesOfItemAtPath:fullPath error:nil];
            // 累加和
            size  += attrs.fileSize;
        }
        
    }else { // 文件
        size = attrsSelf.fileSize;
    }
    
    return size;
}


#pragma mark - 新发现:通过指针修改外部变量的值
- (unsigned long long)rb_fileSize1{
    
    // 总大小
    NSUInteger size = 0;
    
    // 文件管理者
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    // 是否是文件夹
    BOOL isDirectory = NO;
    
    //路径是否存在
    [mgr fileExistsAtPath:self isDirectory:&isDirectory]; // 把 isDirectory 变量的地址传进去, isDirectory 变量的值，才能被修改. 你没有修改 isDirectroy 的值,但是你发现 isDirectory 的值是会变的。神奇之处就在于:通过指针可以修改变量的值。 其实这个方法有两个返回值:1.方法本身会返回一个BOOL值,isDirectory 的值被修改后，并被返回。 类似的还有NSError;你要想看err的值,你只能传一个&err（指针)
    // 语言很难表达，通过指针来修改外部变量的值。C 语言指针,还是要多敲敲代码
    
    NSError *err =  nil;
    [mgr attributesOfItemAtPath:self error:&err]; // (NSError * _Nullable __autoreleasing * _Nullable)
    NSLog(@"%@",err);
    
    
    if (isDirectory) {
        NSLog(@"YES");
    }else{
        NSLog(@"NO");
    }
    
    return size;
}




@end
